package com.hpe.wx.performance.redis.utils;

import java.util.Properties;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisPool {
	private static JedisPool pool = null;

	public static JedisPool getPool() {
		if (pool == null) {
			Properties pros = PropertiesUtils.getPropertiesSet("jedis.properties");
			String ip = pros.getProperty("redis.Ip");
			int port = Integer.parseInt(pros.getProperty("redis.port"));
			int maxActive = Integer.parseInt(pros.getProperty("redis.maxActive"));
			int maxIdle = Integer.parseInt(pros.getProperty("redis.maxIdle"));
			int minIdle = Integer.parseInt(pros.getProperty("redis.minIdle"));
			boolean testOnBorrow = Boolean.parseBoolean(pros.getProperty("redis.testOnBorrow"));
			boolean testOnReturn = Boolean.parseBoolean(pros.getProperty("redis.testOnReturn"));
			boolean testWhileIdle = Boolean.parseBoolean(pros.getProperty("redis.testWhileIdle"));
			int numTestsPerEvictionRun = Integer.parseInt(pros.getProperty("redis.numTestsPerEvictionRun"));
			int timeBetweenEvictionRunsMillis = Integer
					.parseInt(pros.getProperty("redis.timeBetweenEvictionRunsMillis"));
			int maxWaitMillis = Integer.parseInt(pros.getProperty("redis.maxWaitMillis"));

			JedisPoolConfig config = new JedisPoolConfig();
			// 控制一个pool可分配多少个jedis实例，通过pool.getResource()来获取；
			// 如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
			config.setMaxTotal(maxActive);

			// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
			config.setMaxIdle(maxIdle);
			config.setMinIdle(minIdle);

			// 获得一个jedis实例的时候是否检查连接可用性（ping()）
			// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
			config.setTestOnBorrow(testOnBorrow);

			// return 一个jedis实例给pool时，是否检查连接可用性（ping()）
			config.setTestOnReturn(testOnReturn);

			// idle状态监测用异步线程evict进行检查，
			config.setTestWhileIdle(testWhileIdle);

			// 一次最多evict的pool里的jedis实例个数
			config.setNumTestsPerEvictionRun(numTestsPerEvictionRun);

			// test idle 线程的时间间隔
			config.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

			// 表示当borrow(引入)一个jedis实例时，最大的等待时间，如果超过等待时间，则直接抛出JedisConnectionException；
			config.setMaxWaitMillis(maxWaitMillis);

			pool = new JedisPool(config, ip, port, 1000 * 100);
		}
		return pool;
	}

	/**
	 * 退还给连接池
	 * 
	 * @param pool
	 * @param redis
	 */
	public static void returnResource(JedisPool pool, Jedis redis) {
		if (redis != null) {
			pool.returnResource(redis);
		}
	}
}
